package persistencia;

import java.util.Date;
import java.util.List;

import modelo.datos.utils.ListaClientes;
import modelo.datos.utils.ListaFacturas;
import modelo.entidades.Cliente;
import modelo.entidades.Direccion;
import modelo.entidades.Empresa;
import modelo.entidades.Factura;
import modelo.entidades.Periodo;
import modelo.entidades.Cliente.TipoTarifa;
import modelo.entidades.Direccion.TipoVia;
import modelo.entidades.Persona;

public class BaseDatosImpl implements BaseDatos {

    private List<Cliente> clientes;
    private List<Factura> facturas;

    private void nuevoCliente(Cliente cliente) {
	clientes.add(cliente);
    }

    public void nuevaEmpresa(String nombre, String nif, Direccion direccion,
	    TipoTarifa tarifa) {
	Cliente cliente = new Empresa(nombre, nif, direccion, tarifa);
	nuevoCliente(cliente);

    }

    public void nuevaPersona(String nombre, String apellidos, String nif,
	    Direccion direccion, TipoTarifa tarifa) {
	Cliente cliente = new Persona(nombre, apellidos, nif, direccion, tarifa);
	nuevoCliente(cliente);

    }

    public void nuevaFactura(String nif, int metros, TipoTarifa tarifa,
	    Date fechaEmision, Periodo periodo) {
	int codigo = facturas.size() + 1;
	Factura factura = new Factura(codigo, metros, tarifa, fechaEmision,
		periodo);
	facturas.add(factura);
	Cliente cliente = getCliente(nif);
	cliente.addFactura(factura);
    }

    public Direccion nuevaDireccion(TipoVia tipovia, String nombre,
	    int codigoPostal, String patio, String piso, String puerta) {
	return new Direccion(tipovia, nombre, codigoPostal, patio, piso, puerta);
    }

    public boolean actualizaCliente(Cliente cliente) {
	Cliente enLista = getCliente(cliente.getNif());
	if (enLista != null) {
	    enLista.actualiza(cliente);
	    return true;
	}
	return false;
    }

    public boolean borraCliente(String nif) {
	Cliente cliente = getCliente(nif);
	if (cliente == CLIENTE_NULL) {
	    return false;
	} else {
	    clientes.remove(cliente);
	}
	return true;
    }

    public boolean actualizaFactura(Factura factura) {
	Factura enLista = getFactura(factura.getCodigo());
	if (enLista != null) {
	    enLista.actualiza(factura);
	    return true;
	}
	return false;
    }

    public boolean borraFactura(int codigo) {
	Factura factura = getFactura(codigo);
	if (factura == FACTURA_NULL) {
	    return false;
	} else {
	    facturas.remove(factura);
	}
	return true;
    }

    public Cliente getCliente(String nif) {
	for (Cliente cliente : clientes)
	    if (cliente.getNif().equals(nif))
		return cliente;
	return CLIENTE_NULL;
    }

    public Factura getFactura(int codigo) {
	for (Factura factura : facturas)
	    if (factura.getCodigo() == codigo)
		return factura;
	return FACTURA_NULL;
    }

    public ListaClientes getClientes() {
	return new ListaClientes(clientes);
    }

    public ListaFacturas getFacturasCliente(String nif) {
	return new ListaFacturas(facturas);
    }

    public ListaFacturas getFacturasClienteEntreFechas(String nif, Date desde,
	    Date hasta) {
	// NOTA Auto-generated method stub
	return null;
    }

}
